package com.youlai.system.service.impl;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.lang.Assert;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.youlai.system.converter.EmployConverter;
import com.youlai.system.converter.SalaryConverter;
import com.youlai.system.converter.SocialSecurityConverter;
import com.youlai.system.mapper.AttendancerecordMapper;
import com.youlai.system.mapper.EmployMapper;
import com.youlai.system.mapper.SalaryMapper;
import com.youlai.system.mapper.SocialSecurityMapper;
import com.youlai.system.model.entity.*;
import com.youlai.system.model.form.EmployForm;
import com.youlai.system.model.form.SalaryForm;
import com.youlai.system.model.form.SocialSecurityForm;
import com.youlai.system.model.query.EmployQuery;
import com.youlai.system.model.vo.EmployExportVO;
import com.youlai.system.model.vo.EmployVO;
import com.youlai.system.service.EmployService;
import lombok.Data;
import org.apache.commons.lang3.ArrayUtils;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Service;

import java.time.LocalDate;
import java.util.*;

@Service
@Data
public class EmployServiceImpl extends ServiceImpl<EmployMapper, Employ> implements EmployService {

    private final AttendancerecordMapper attendancerecordMapper;
    private final EmployMapper employMapper;
    private final EmployConverter employConverter;
    private final SalaryMapper salaryMapper;
    private final SalaryConverter salaryConverter;
    private final SocialSecurityConverter socialSecurityConverter;
    private final SocialSecurityMapper socialSecurityMapper;
    @Override
    public PageInfo<EmployVO> getEmployList(EmployQuery queryParams) {
        int pageNum = queryParams.getPageNum();
        int pageSize = queryParams.getPageSize();
        String keyword = queryParams.getKeyword();

        PageHelper.startPage(pageNum,pageSize);

        Integer departmentId = queryParams.getDepartmentId();

        List<EmployVO> list =  employMapper.list(keyword,departmentId);



        //根据当前月份动态选择插入工作
        //每一次查询员工就会插入对应的考勤
        // TODO 新增员工和修改员工不会加入对应的考勤
        QueryWrapper<Employ> queryWrapper = new QueryWrapper<Employ>()
                .select("id","department_id");
        List<Employ> employs = this.list(queryWrapper);

        //获取当然得年月日，组合成day
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(new Date());
        int daysInMonth = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
        int year = calendar.get(Calendar.YEAR); //2024
        int month = calendar.get(Calendar.MONTH) + 1; // 月份从 0 开始计数，所以要加 1
        String formattedMonth = (month < 10) ? "0" + month : String.valueOf(month);
        String formattedDayOfMonth = (daysInMonth < 10) ? "0" + daysInMonth : String.valueOf(daysInMonth);
        int datate = year * 10000 + Integer.parseInt(formattedMonth) * 100 + Integer.parseInt(formattedDayOfMonth);//当月的天数
        int firstDayOfTheMonth = year * 10000 + Integer.parseInt(formattedMonth) * 100 + 01; //当月的第一天
        System.out.println(firstDayOfTheMonth);

        //查询最后一个员工
        int lastEmploy = employMapper.selectLastEmploy();

        //查询数据是否有相同的考勤
        Attendancerecord attendancerecord = attendancerecordMapper.selectSameAttendande();

        //根据最后一个员工id和当月总天数查询出最后一条数据
        Employ isExitLastData = attendancerecordMapper.selectIsExitLastData(datate, lastEmploy);
        if (attendancerecord == null) {
            if (isExitLastData == null) { // 如果 isExitLastData 为 null，则执行下面的代码
                List<Attendancerecord> records = new ArrayList<>();
                for (Employ employ : employs) {
                    for (int i = firstDayOfTheMonth; i <= datate; i++) {
                        Attendancerecord record = new Attendancerecord();
                        record.setUserId(employ.getId());
                        record.setDepartmentId(employ.getDepartmentId());
                        record.setDay(String.valueOf(i));
                        records.add(record);
                    }
                }
                System.out.println(records);
                attendancerecordMapper.insertBatch(records);
            }
        }

        return new PageInfo<>(list);

    }
//    public static int getRandomNumber(int min, int max) {
//        return (int) ((Math.random() * (max - min + 1)) + min);
//    }
//    public static Calendar generateRandomDate() {
//        // 创建一个 Calendar 实例
//        Calendar calendar = new GregorianCalendar();
//
//        // 设置年份为随机年份（1900年至今）
//        int year = getRandomNumber(2010, Calendar.getInstance().get(Calendar.YEAR));
//        calendar.set(Calendar.YEAR, year);
//
//        // 设置月份为随机月份（1至12月）
//        int month = getRandomNumber(1, 12);
//        calendar.set(Calendar.MONTH, month - 1); // 月份从0开始，所以需要减去1
//
//        // 设置日期为随机日期（1至月份的最大天数）
//        int day = getRandomNumber(1, calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
//        calendar.set(Calendar.DAY_OF_MONTH, day);
//
//        return calendar;
//    }
//    public static LocalDate calendarToLocaDate(Calendar calendar) {
//        // 获取 Calendar 对象的年、月、日
//        int year = calendar.get(Calendar.YEAR);
//        int month = calendar.get(Calendar.MONTH) + 1; // 月份从0开始，需要加1
//        int day = calendar.get(Calendar.DAY_OF_MONTH);
//
//        // 使用 LocalDate 类的 of 方法创建 LocalDate 对象
//        return LocalDate.of(year, month, day);
//    }

    @Override
    public Integer saveEmploy(EmployForm employForm) {


// 从数据库中查询所有 Employ 对象
        List<Employ> list = employMapper.findAll1();
        System.out.println(list);

// 创建 WorkNumberArray 并填充数据
        String[] WorkNumberArray = new String[list.size()];
        int index = 0;
        for (Employ employ : list) {
            WorkNumberArray[index++] = String.valueOf(employ.getWorkNumber());
        }

// 生成唯一的工号并设置到 employForm 中
        String prefix = "TSGUAS";
        int maxNumber = 9999;
        boolean isUnique = false;
        String newWorkNumber = "";

        while (!isUnique) {
            int randomNumber = (int) (Math.random() * maxNumber);
            newWorkNumber = prefix + String.format("%04d", randomNumber);

            // 检查新生成的工号是否已经存在于 WorkNumberArray 中
            if (!ArrayUtils.contains(WorkNumberArray, newWorkNumber)) {
                isUnique = true;
            }
        }

        employForm.setWorkNumber(newWorkNumber);

        Employ entity = employConverter.formEntity(employForm);
//        boolean result = employMapper.saveEmploy(entity);
        boolean result = this.save(entity);
        Employ employ1=this.selectNewOne(employForm.getWorkNumber());
        Assert.isTrue(result,"员工保存失败");
        SalaryForm salaryForm=new SalaryForm();
        salaryForm.setUserId(employ1.getId());
        Salary salary = salaryConverter.form2Entity(salaryForm);
        boolean result1 =salaryMapper.addSalary(salary);
        SocialSecurityForm socialSecurityForm=new SocialSecurityForm();
        socialSecurityForm.setUserId(employ1.getId());
        socialSecurityForm.setProvidentFundCityId("1");
        socialSecurityForm.setParticipatingInTheCityId("1");
        socialSecurityForm.setHouseholdRegistration("1");
        SocialSecurity socialSecurity = socialSecurityConverter.form2Entity(socialSecurityForm);
        boolean result2 =socialSecurityMapper.saveSocialSecurity(socialSecurity);
        Assert.isTrue(result1,"工资保存失败");
        Assert.isTrue(result2,"社保保存失败");
        return entity.getId();
//        int j;
//        for (j=1;j<150;j++){
//            String[] firstNameArray = {
//                    "赵", "钱", "孙", "李", "周", "吴", "郑", "王", "冯", "陈",
//                    "褚", "卫", "蒋", "沈", "韩", "杨", "朱", "秦", "尤", "许",
//                    "何", "吕", "施", "张", "孔", "曹", "严", "华", "金", "魏",
//                    "陶", "姜", "戚", "谢", "邹", "喻", "柏", "水", "窦", "章",
//                    "云", "苏", "潘", "葛", "奚", "范", "彭", "郎", "鲁", "韦",
//                    "昌", "马", "苗", "凤", "花", "方", "俞", "任", "袁", "柳",
//                    "酆", "鲍", "史", "唐", "费", "廉", "岑", "薛", "雷", "贺",
//                    "倪", "汤", "滕", "殷", "罗", "毕", "郝", "邬", "安", "常",
//                    "乐", "于", "时", "傅", "皮", "卞", "齐", "康", "伍", "余",
//                    "元", "卜", "顾", "孟", "平", "黄", "和", "穆", "萧", "尹",
//                    "姚", "邵", "湛", "汪", "祁", "毛", "禹", "狄", "米", "贝",
//                    "明", "臧", "计", "伏", "成", "戴", "谈", "宋", "茅", "庞",
//                    "熊", "纪", "舒", "屈", "项", "祝", "董", "梁", "杜", "阮",
//                    "蓝", "闵", "席", "季", "麻", "强", "贾", "路", "娄", "危",
//                    "江", "童", "颜", "郭", "梅", "盛", "林", "***", "钟", "徐",
//                    "邱", "骆", "高", "夏", "蔡", "田", "樊", "胡", "凌", "霍",
//                    "虞", "万", "支", "柯", "咎", "管", "卢", "莫", "经", "房",
//                    "裘", "缪", "干", "解", "应", "宗", "宣", "丁", "贲", "邓",
//                    "郁", "单", "杭", "洪", "包", "诸", "左", "石", "崔", "吉",
//                    "钮", "龚", "程", "嵇", "邢", "滑", "裴", "陆", "荣", "翁",
//                    "荀", "羊", "於", "惠", "甄", "魏", "加", "封", "芮", "羿",
//                    "储", "靳", "汲", "邴", "糜", "松", "井", "段", "富", "巫",
//                    "乌", "焦", "巴", "弓", "牧", "隗", "山", "谷", "车", "侯",
//                    "宓", "蓬", "全", "郗", "班", "仰", "秋", "仲", "伊", "宫",
//                    "宁", "仇", "栾", "暴", "甘", "钭", "厉", "戎", "祖", "武",
//                    "符", "刘", "姜", "詹", "束", "龙", "叶", "幸", "司", "韶",
//                    "郜", "黎", "蓟", "薄", "印", "宿", "白", "怀", "蒲", "台",
//                    "从", "鄂", "索", "咸", "籍", "赖", "卓", "蔺", "屠", "蒙",
//                    "池", "乔", "阴", "郁", "胥", "能", "苍", "双", "闻", "莘",
//                    "党", "翟", "谭", "贡", "劳", "逄", "姬", "申", "扶", "堵",
//                    "冉", "宰", "郦", "雍", "却", "璩", "桑", "桂", "濮", "牛",
//                    "寿", "通", "边", "扈", "燕", "冀", "郏", "浦", "尚", "农", "温", "别", "庄", "晏", "柴",
//                    "瞿", "阎", "充", "慕", "连", "茹", "习", "宦", "艾", "鱼",
//                    "容", "向", "古", "易", "慎", "戈", "廖", "庚", "终", "暨",
//                    "居", "衡", "步", "都", "耿", "满", "弘", "匡", "国", "文",
//                    "寇", "广", "禄", "阙", "东", "殴", "殳", "沃", "利", "蔚",
//                    "越", "夔", "隆", "师", "巩", "厍", "聂", "晁", "勾", "敖",
//                    "融", "冷", "訾", "辛", "阚", "那", "简", "饶", "空", "曾",
//                    "毋", "沙", "乜", "养", "鞠", "须", "丰", "巢", "关", "蒯",
//                    "相", "查", "后", "江", "红", "游", "竺", "权", "逯", "盖",
//                    "益", "桓", "公", "万", "俟", "司", "马", "上", "官", "欧",
//                    "阳", "夏", "侯", "诸", "葛", "闻", "人", "东", "方", "赫",
//                    "连", "皇", "甫", "尉", "迟", "公", "羊", "澹", "台", "公",
//                    "冶", "宗", "政", "濮", "阳", "淳", "于", "仲", "孙", "太",
//                    "叔", "申", "屠", "公", "孙", "乐", "正", "轩", "辕", "令",
//                    "狐", "钟", "离", "闾", "丘", "长", "孙", "慕", "容", "鲜",
//                    "于", "宇", "文", "司", "徒", "司", "空", "亓", "官", "司",
//                    "寇", "仉", "督", "子", "车", "颛", "孙", "端", "木", "巫",
//                    "马", "公", "西", "漆", "雕", "乐", "正", "壤", "驷", "公",
//                    "良", "拓", "拔", "夹", "谷", "宰", "父", "谷", "粱", "晋",
//                    "楚", "阎", "法", "汝", "鄢", "涂", "钦", "段", "干", "百",
//                    "里", "东", "郭", "南", "门", "呼", "延", "归", "海", "羊",
//                    "舌", "微", "生", "岳", "帅", "缑", "亢", "况", "后", "有",
//                    "琴", "梁", "丘", "左", "丘", "东", "门", "西", "门", "商",
//                    "牟", "佘", "佴", "伯", "赏", "南", "宫", "墨", "哈", "谯",
//                    "笪", "年", "爱", "阳", "佟", "第", "五", "言", "福", "百",
//                    "家", "姓", "续"
//            };
//            String[] girlNames = {
//                    "秀", "娟", "英", "华", "慧", "巧", "美", "娜", "静", "淑",
//                    "惠", "珠", "翠", "雅", "芝", "玉", "萍", "红", "娥", "玲",
//                    "芬", "芳", "燕", "彩", "春", "菊", "兰", "凤", "洁", "梅",
//                    "琳", "素", "云", "莲", "真", "环", "雪", "荣", "爱", "妹",
//                    "霞", "香", "月", "莺", "媛", "艳", "瑞", "凡", "佳", "嘉",
//                    "琼", "勤", "珍", "贞", "莉", "桂", "娣", "叶", "璧", "璐",
//                    "娅", "琦", "晶", "妍", "茜", "秋", "珊", "莎", "锦", "黛",
//                    "青", "倩", "婷", "姣", "婉", "娴", "瑾", "颖", "露", "瑶",
//                    "怡", "婵", "雁", "蓓", "纨", "仪", "荷", "丹", "蓉", "眉",
//                    "君", "琴", "蕊", "薇", "菁", "梦", "岚", "苑", "婕", "馨",
//                    "瑗", "琰", "韵", "融", "园", "艺", "咏", "卿", "聪", "澜",
//                    "纯", "毓", "悦", "昭", "冰", "爽", "琬", "茗", "羽", "希",
//                    "宁", "欣", "飘", "育", "滢", "馥", "筠", "柔", "竹", "霭",
//                    "凝", "晓", "欢", "霄", "枫", "芸", "菲", "寒", "伊", "亚",
//                    "宜", "可", "姬", "舒", "影", "荔", "枝", "思", "丽"
//            };
//
//            String[] boyNames = {
//                    "伟", "刚", "勇", "毅", "俊", "峰", "强", "军", "平", "保",
//                    "东", "文", "辉", "力", "明", "永", "健", "世", "广", "志",
//                    "义", "兴", "良", "海", "山", "仁", "波", "宁", "贵", "福",
//                    "生", "龙", "元", "全", "国", "胜", "学", "祥", "才", "发",
//                    "武", "新", "利", "清", "飞", "彬", "富", "顺", "信", "子",
//                    "杰", "涛", "昌", "成", "康", "星", "光", "天", "达", "安",
//                    "岩", "中", "茂", "进", "林", "有", "坚", "和", "彪", "博",
//                    "诚", "先", "敬", "震", "振", "壮", "会", "思", "群", "豪",
//                    "心", "邦", "承", "乐", "绍", "功", "松", "善", "厚", "庆",
//                    "磊", "民", "友", "裕", "河", "哲", "江", "超", "浩", "亮",
//                    "政", "谦", "亨", "奇", "固", "之", "轮", "翰", "朗", "伯",
//                    "宏", "言", "若", "鸣", "朋", "斌", "梁", "栋", "维", "启",
//                    "克", "伦", "翔", "旭", "鹏", "泽", "晨", "辰", "士", "以",
//                    "建", "家", "致", "树", "炎", "德", "行", "时", "泰", "盛",
//                    "雄", "琛", "钧", "冠", "策", "腾", "楠", "榕", "风", "航",
//                    "弘"
//            };
//
//            String  name;
//            int randomRange = ThreadLocalRandom.current().nextInt(1, 7); // 生成1到6之间的随机整数
//            int first = ThreadLocalRandom.current().nextInt(1, 571);
//            int g = ThreadLocalRandom.current().nextInt(1, 150);
//            int b = ThreadLocalRandom.current().nextInt(1, 150);
//            if (randomRange == 1){
//                name = firstNameArray[first] + girlNames[g];
//            }else if (randomRange == 2){
//                name = firstNameArray[first] + boyNames[g];
//            }else if (randomRange == 3){
//                name = firstNameArray[first] + girlNames[g] +girlNames[g];
//            }else if (randomRange == 4){
//                name = firstNameArray[first] + boyNames[g] +boyNames[g];
//            }else if (randomRange == 5){
//                name = firstNameArray[first] + girlNames[g] +girlNames[g] +girlNames[g];
//            }else if (randomRange == 6){
//                name = firstNameArray[first] + boyNames[b] +boyNames[b] +boyNames[b];
//            }else {
//                name = firstNameArray[first] + boyNames[b] + girlNames[b];
//            }
//            //电话号码
//            String[] telFirst = {"133", "149", "153", "173", "177", "180", "181", "189", "199"};
//            Random random = new Random();
//            // 随机选择一个前缀
//            String one = telFirst[random.nextInt(telFirst.length)];
//            // 生成剩余的8位数字
//            StringBuilder phoneNumber = new StringBuilder(first);
//            for (int i = 0; i < 8; i++) {
//                phoneNumber.append(random.nextInt(10));
//            }
//            String mobile = one + phoneNumber.toString();
//            //部门id
//            String[] depId = {"1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "13", "14", "27", "28", "29", "30", "31"};
//            int d = ThreadLocalRandom.current().nextInt(0, 18);
//            //工号
//            // 定义随机数生成器
//            Random work = new Random();
//            // 生成四位随机数字
//            String workN= String.valueOf(work.nextInt(9000) + 1000); // 生成1000到9999之间的随机数
//            String workNumber = "TSGUAS"+workN;
//            //随机时间（入职时间，转正时间）
//            // 创建一个 Calendar 实例
//            Calendar calendar = new GregorianCalendar();
//            // 设置年份为随机年份（2010年至今）
//            int year = getRandomNumber(2010, Calendar.getInstance().get(Calendar.YEAR));
//            calendar.set(Calendar.YEAR, year);
//            // 设置月份为随机月份（1至12月）
//            int month = getRandomNumber(1, 12);
//            calendar.set(Calendar.MONTH, month - 1); // 月份从0开始，所以需要减去1
//            // 设置日期为随机日期（1至月份的最大天数）
//            int day = getRandomNumber(1, calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
//            calendar.set(Calendar.DAY_OF_MONTH, day);
//
//            //随机正式关系
//            int onetwo = ThreadLocalRandom.current().nextInt(1, 3);
//            //创造模拟对象
//            Employ employ = new Employ();
//            employ.setUsername(name);
//            employ.setMobile(mobile);
//            employ.setWorkNumber(workNumber);
//            employ.setTimeOfEntry(calendarToLocaDate((generateRandomDate())));
//            employ.setCorrectionTime(calendarToLocaDate(generateRandomDate()));
//            employ.setDepartmentId(Integer.valueOf(depId[d]));
//            employ.setFormOfEmployment(onetwo);
//            employ.setRoleIds("1");
//            System.out.println(employ);
//            employMapper.insert(employ);
//        }
//        return null;
    }

    @Override
    public Employ selectNewOne(String workNumber) {
        Employ employ=employMapper.selectNewOne(workNumber);
        return employ;
    }


    @Override
    public Integer UpdateEmploy(EmployForm employForm) {
        Employ entity = employConverter.formEntity(employForm);

        boolean result = employMapper.UpdateEmploy(entity);
        Assert.isTrue(result,"员工修改失败");
        return entity.getId();
    }

    @Override
    public boolean deleteByIds(String ids) {
        QueryWrapper<Employ> employQueryWrapper = new QueryWrapper<Employ>()
                .eq("id",ids);
        return this.remove(employQueryWrapper);
    }

    @Override
    public EmployForm getEmployForm(Long id) {
        Employ entity = employMapper.selectByEmployId(id);
        String roleIds = entity.getRoleIds();
        EmployForm employForm = employConverter.entityForm(entity);
        if (roleIds.length()>2){
            employForm.setRoleIdArray(roleIds.split(","));
        }
        String[] roleIdArray = { roleIds };
        employForm.setRoleIdArray(roleIdArray);
        return employForm;
    }

    @Override
    public boolean insertEmploy(Employ employ) {
        try {
            employMapper.saveEmploy(employ);
            return true; // 如果没有抛出异常，表示插入成功
        } catch (Exception e) {
            e.printStackTrace(); // 可以根据需要记录日志或其他操作
            return false; // 插入失败，返回 false
        }
    }

    @Override
    public List<EmployExportVO> listExportEmploy(EmployQuery queryParams) {
        String keyword = queryParams.getKeyword();
        Integer departmentId = queryParams.getDepartmentId();
        List<EmployExportVO> list = employMapper.list1(keyword,departmentId);
        return list;
    }

    @Override
    public Integer saveEmployPhoto(String staffPhoto,Integer id) {
        return employMapper.savePhoto(staffPhoto,id);
    }

    @Override
    public Integer saveEmployRole(Integer id,String[] roleIdArray) {
        String sq = String.join(",", roleIdArray);
        System.out.println(sq);
         employMapper.insertEmployRole(id,sq);
        return null;
    }

    @Override
    public Integer saveEmployRole1(Integer id, String roleIdArray) {
        employMapper.insertEmployRole1(id,roleIdArray);
        return null;
    }

    @Override
    public Employ login(String workNumber, String mobile) {
        Employ employ = employMapper.selectByEmployWorkNumber(workNumber);
        if (employ == null){
            throw new RuntimeException("账号不存在");
        }
        return employ;
    }

    @Override
    public Employ getCurrentEmployInfo() {
        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
        Object principal = authentication.getPrincipal();
        Employ employ = new Employ();
        BeanUtil.copyProperties(principal,employ);
        System.out.println(employ);
        Employ employById = employMapper.getEmployById(employ);

        return employById;
    }

    @Override
    public boolean deleteEmploy(Integer id) {
        boolean result = employMapper.deleteEmploy(id);
        Employ employ = new Employ();
        employ.setId(id);
        Employ employ1 = employMapper.getEmployById(employ);
        // 获取当前日期（年月日）
        LocalDate currentDate = LocalDate.now();
        // 假设 setTimeOfOut 方法接受一个 LocalDate 类型的参数
        employ1.setTimeOfOut(currentDate);
        //更新离职时间
        int b=this.updatetimeofout(employ1);
        boolean result1=salaryMapper.deleteSalary(employ1.getId());
        return result;
    }

    @Override
    public int updatetimeofout(Employ employ) {
        int a = employMapper.updatetimeofout(employ);
        return a;
    }


}
